difference between shallow copy and deep copy constructor in c